package data_structures_and_algorithms.sort.learn;

import java.util.Arrays;

/**
 * @ClassName Example01
 * @Description: TODO
 * @Author: yongliang.ma
 * @Create_time:2022/10/23 19:21
 */
public class Example01 {

    public static void main(String[] args) {
        int[] nums = {1,3,7,4,3,7,9,43,12};
        System.out.println(Arrays.toString(nums));

//        selectSort(nums);
//        bubbleSort(nums);
        insertSort(nums);// error
        System.out.println(Arrays.toString(nums));

    }

    // 1、选择排序：从头开始，分别和后面的每一位比较，保证当前位置是后面序列中最小的一位
    public static void selectSort(int[] nums){
        if (nums == null || nums.length == 1)
            return ;
        for (int i = 0; i < nums.length - 1; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] > nums[j]){
                    swap(nums, i, j);
                }
            }
        }
    }

    private static void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

    // 2、冒泡排序：从第一个位置开始将最大的数字移动到末尾，依次循环，下一次移动到倒数第二位
    public static void bubbleSort(int[] nums){
        if (nums == null || nums.length == 1)
            return;
        for (int i = nums.length - 1; i > 0; i--) {
            for (int j = 0; j < i ; j++) {
                if (nums[j] > nums[j + 1]){
                    swap(nums, j + 1, j);// 交换j 和 j + 1 位置上的元素
                }
            }
        }
    }

    // 3、插入排序：保证前边的数字有序，然后逐个想后排，联系打牌时候整理牌（抓了一手牌然后新牌进来了怎么放）
    public static void insertSort(int[] nums){
        if (nums == null || nums.length == 1)
            return;

        for (int i = 1; i < nums.length; i++) {
            int j = i;
            while (j > 0 && nums[j] < nums[j - 1]){
                swap(nums, j, j - 1);
                j--;// 移动下标 向前判断
            }
        }
    }
}
